home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / machserver / 1.098 / vm / vmTrace.c < prev    next >
C/C++ Source or Header  |  1990-09-12  |  5KB  |  216 lines

  1. /* vmTrace.c --
  2.  *
  3.  *         Virtual memory tracing routines.
  4.  *
  5.  * Copyright (C) 1985 Regents of the University of California
  6.  * All rights reserved.
  7.  */
  8.  
  9. #ifndef lint
  10. static char rcsid[] = "$Header: /sprite/src/kernel/vm/RCS/vmTrace.c,v 9.2 90/09/12 13:36:46 shirriff Exp $ SPRITE (Berkeley)";
  11. #endif not lint
  12.  
  13. #include <sprite.h>
  14. #include <vm.h>
  15. #include <vmInt.h>
  16. #include <vmTrace.h>
  17. #include <mach.h>
  18. #include <sync.h>
  19. #include <sys.h>
  20. #include <stdio.h>
  21. #include <bstring.h>
  22.  
  23. Sync_Semaphore    traceMutex = Sync_SemInitStatic("Vm:traceMutex");
  24.  
  25. Boolean        vm_Tracing = FALSE;
  26. int        vmTracesPerClock;
  27. int        vmTracesToGo;
  28. char        *vmTraceBuffer = (char *)NIL;
  29. int        vmTraceFirstByte;
  30. int        vmTraceNextByte;
  31. int        vmTraceTime = 0;
  32. Fs_Stream    *vmTraceFilePtr = (Fs_Stream *)NIL;
  33. Boolean        vmTraceDumpStarted = FALSE;
  34. Vm_TraceStats    vmTraceStats;
  35. Boolean        vmTraceNeedsInit = FALSE;
  36.  
  37.  
  38. /*
  39.  * ----------------------------------------------------------------------------
  40.  *
  41.  * VmStoreTraceRec --
  42.  *
  43.  *      Store a trace record into the trace buffer.
  44.  *  
  45.  * Results:
  46.  *    None.
  47.  *
  48.  * Side effects:
  49.  *    Trace buffer modified if the record will fit.
  50.  *
  51.  * ----------------------------------------------------------------------------
  52.  */
  53. void
  54. VmStoreTraceRec(recType, size, traceRecAddr, checkOverflow)
  55.     int        recType;    /* The type of trace record. */
  56.     int        size;        /* Size of the trace record to dump. */
  57.     Address    traceRecAddr;    /* Trace record to dump. */
  58.     Boolean    checkOverflow;    /* TRUE implies if should check to see if
  59.                  * should dump the buffer. */
  60. {
  61.     short    *shortPtr;
  62.  
  63.     MASTER_LOCK(&traceMutex);
  64.     Sync_SemRegister(&traceMutex);
  65.  
  66.     if (vmTraceNextByte - vmTraceFirstByte > VM_TRACE_BUFFER_SIZE - size) {
  67.     vmTraceStats.traceDrops++;
  68.     MASTER_UNLOCK(&traceMutex);
  69.     return;
  70.     }
  71.     if ((vmTraceNextByte & VM_TRACE_BUF_MASK) !=
  72.         ((vmTraceNextByte + size - 1) & VM_TRACE_BUF_MASK)) {
  73.     /*
  74.      * We are at the end of the buffer so skip to the end of the
  75.      * buffer.
  76.      */
  77.     shortPtr = VM_GET_TRACE_BUFFER_PTR(short);
  78.     *shortPtr = VM_TRACE_SKIP_REC;
  79.     vmTraceNextByte = (vmTraceNextByte + size) & VM_TRACE_BUF_MASK;
  80.     if (vmTraceNextByte - vmTraceFirstByte > 
  81.                 VM_TRACE_BUFFER_SIZE - size) {
  82.         vmTraceStats.traceDrops++;
  83.         MASTER_UNLOCK(&traceMutex);
  84.         return;
  85.     }
  86.     }
  87.     if (recType != 0) {
  88.     short    *shortPtr;
  89.  
  90.     shortPtr = (short *)traceRecAddr;
  91.     *shortPtr = recType;
  92.     }
  93.     bcopy(traceRecAddr, VM_GET_TRACE_BUFFER_PTR(char), size);
  94.     vmTraceNextByte += size;
  95.     if (checkOverflow) {
  96.     if (vmTraceNextByte - vmTraceFirstByte > VM_TRACE_BUFFER_SIZE / 2 &&
  97.         !vmTraceDumpStarted) {
  98.         vmTraceDumpStarted = TRUE;
  99.         Proc_CallFunc(VmTraceDump, (ClientData)0, 0);
  100.     }
  101.     }
  102.     MASTER_UNLOCK(&traceMutex);
  103. }
  104.  
  105.  
  106. /*
  107.  *----------------------------------------------------------------------
  108.  *
  109.  * VmTraceDump --
  110.  *
  111.  *    Daemon to dump virtual memory trace records to a file.
  112.  *
  113.  * Results:
  114.  *    None.
  115.  *
  116.  * Side effects:
  117.  *    Page freed.
  118.  *
  119.  *----------------------------------------------------------------------
  120.  */
  121. /* ARGSUSED */
  122. void
  123. VmTraceDump(data, callInfoPtr)
  124.     ClientData    data;
  125.     Proc_CallInfo    *callInfoPtr;
  126. {
  127.     int            curNextByte;
  128.     int            length;
  129.     int            savedLength;
  130.     ReturnStatus    status;
  131.  
  132.     vmTraceStats.traceDumps++;
  133.  
  134.     /*
  135.      * Dump the trace buffer.
  136.      */
  137.     curNextByte = vmTraceNextByte;
  138.     while (vmTraceFirstByte != curNextByte) {
  139.     length = VM_TRACE_BUFFER_SIZE - VM_GET_BUFFER_INDEX(vmTraceFirstByte);
  140.     if (curNextByte - vmTraceFirstByte < length) {
  141.         length = curNextByte - vmTraceFirstByte;
  142.     }
  143.     savedLength = length;
  144.     status = Fs_Write(vmTraceFilePtr, 
  145.               vmTraceBuffer + VM_GET_BUFFER_INDEX(vmTraceFirstByte),
  146.               vmTraceFirstByte, &length);
  147.     if (status != SUCCESS) {
  148.         printf("%s VmTraceDaemon: Couldn't write trace file, reason %x\n",
  149.             "Warning:", status);
  150.         break;
  151.     } else if (length != savedLength) {
  152.         printf("Warning: VmTraceDaemon: Short write, length = %d\n",
  153.             length);
  154.         break;
  155.     }
  156.     vmTraceFirstByte += length;
  157.     }
  158.     vmTraceDumpStarted = FALSE;
  159. }
  160.  
  161.  
  162. /*
  163.  *----------------------------------------------------------------------
  164.  *
  165.  * VmCheckTraceOverflow --
  166.  *
  167.  *    Dump the trace buffer if it is about to overflow.
  168.  *
  169.  * Results:
  170.  *    None.
  171.  *
  172.  * Side effects:
  173.  *    None.
  174.  *
  175.  *----------------------------------------------------------------------
  176.  */
  177. void
  178. VmCheckTraceOverflow()
  179. {
  180.     MASTER_LOCK(&traceMutex);
  181.     if (vmTraceNextByte - vmTraceFirstByte > VM_TRACE_BUFFER_SIZE / 2 &&
  182.     !vmTraceDumpStarted) {
  183.     vmTraceDumpStarted = TRUE;
  184.     Proc_CallFunc(VmTraceDump, (ClientData)0, 0);
  185.     }
  186.     MASTER_UNLOCK(&traceMutex);
  187. }
  188.  
  189.  
  190. /*
  191.  *----------------------------------------------------------------------
  192.  *
  193.  * Vm_StoreTraceTime --
  194.  *
  195.  *    Write a trace time stamp.
  196.  *
  197.  * Results:
  198.  *    None.
  199.  *
  200.  * Side effects:
  201.  *    None.
  202.  *
  203.  *----------------------------------------------------------------------
  204.  */
  205. void
  206. Vm_StoreTraceTime(timeStamp)
  207.     Timer_Ticks    timeStamp;
  208. {
  209.     Vm_TraceTimeStamp    timeStampRec;
  210.  
  211.     bcopy((Address)&timeStamp, (Address)&timeStampRec.time,
  212.         sizeof(timeStampRec.time));
  213.     VmStoreTraceRec(VM_TRACE_TIME_REC, sizeof(timeStampRec),
  214.              (Address)&timeStampRec, TRUE);
  215. }
  216.